package trainee.compra.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import trainee.compra.to.ProductoTO;
import trainee.compra.utilitarios.ExcepcionConexion;

public class ProductoDAO {
    private EntityManager entityManager;

    public ProductoDAO() {

    }

    /**
     * Se contruye el objeto entregandole el Entity Manager para poder
     * realizar las consoltas a la base de datos
     * 
     * @param entityManager
     */
    public ProductoDAO(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    /**
     * Entrega un listado con todos los productos existentes en la base de
     * datos
     * 
     * @param ninguno
     * @return Listado de tipo PoductoTO con todos los productos.
     */
    public List<ProductoTO> obtenerTodosProductos() throws ExcepcionConexion {
        try {
            Query query =
                    entityManager.createQuery("select p from ProductoTO p");
            return query.getResultList();
        } catch (Exception e) {
            throw new ExcepcionConexion(
                    "Error al conectar a la base de datos. Comuniquese con el administrador");
        }
    }

    /**
     * Entrega un listado de dies productos desde el parametro "inicial" que
     * se entrega
     * 
     * @param inicial
     *            : indice desde el que se entregan dies productos
     * @return listado de objetos (ProductoTO)
     */
    public List<ProductoTO> obtenerDiesProductos(int inicial)
            throws ExcepcionConexion {
        try {
            Query query =
                    entityManager
                            .createQuery(
                                    "select p from ProductoTO p where p.stock>0")
                            .setFirstResult(inicial).setMaxResults(10);
            return query.getResultList();
        } catch (Exception e) {
            throw new ExcepcionConexion(
                    "Error al conectar a la base de datos. Comuniquese con el administrador");
        }
    }

    /**
     * Entrega el stock actual de un producto
     * 
     * @param codigoProducto
     *            codigo del producto a solicitar el stock
     * @return stock actual del producto solicitado
     */
    public int obtenerStockProducto(String codigoProducto)
            throws ExcepcionConexion {
        try {
            Query query =
                    entityManager
                            .createQuery("select p from ProductoTO p where p.codProducto = :p");
            query.setParameter("p", codigoProducto);
            List<ProductoTO> listProducto = query.getResultList();
            for (ProductoTO producto : listProducto) {
                return producto.getStock();
            }
            return 0;
        } catch (Exception e) {
            throw new ExcepcionConexion(
                    "Error al conectar a la base de datos. Comuniquese con el administrador");
        }
    }

    /**
     * Descuenta el stock de un producto segun la cantidad a comprar
     * 
     * @param codigoProducto
     *            codigo del producto a disminuir el stock
     * @param cantidad
     *            cantidad de stock a descontar
     */
    public void descontarStockProducto(String codigoProducto, int cantidad)
            throws ExcepcionConexion {
        try {
            Query query =
                    entityManager
                            .createQuery("update ProductoTO p set p.stock = p.stock-:c where p.codProducto=:p");
            query.setParameter("p", codigoProducto).setParameter("c", cantidad)
                    .executeUpdate();
        } catch (Exception e) {
            throw new ExcepcionConexion(
                    "Error al conectar a la base de datos. Comuniquese con el administrador");
        }
    }
}
